package date_202405

import "math"

//209. 长度最小的子数组
//中等
//相关标签
//相关企业
//给定一个含有 n 个正整数的数组和一个正整数 target 。
//
//找出该数组中满足其总和大于等于 target 的长度最小的 连续
//子数组
//[numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。
//
//
//
//示例 1：
//
//输入：target = 7, nums = [2,3,1,2,4,3]
//输出：2
//解释：子数组 [4,3] 是该条件下的长度最小的子数组。
//示例 2：
//
//输入：target = 4, nums = [1,4,4]
//输出：1
//示例 3：
//
//输入：target = 11, nums = [1,1,1,1,1,1,1,1]
//输出：0
//
//
//提示：
//
//1 <= target <= 109
//1 <= nums.length <= 105
//1 <= nums[i] <= 105
//
//
//进阶：
//
//如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

func minSubArrayLen(target int, nums []int) int {
	if len(nums) == 0 {
		return 0
	}

	minLen := math.MaxInt
	sum := 0
	left, right := 0, 0
	for right < len(nums) || left < len(nums) {
		if sum >= target {
			minLen = IntMin1(minLen, right-left)
			sum = sum - nums[left]
			left++
		} else if right < len(nums) {
			sum = sum + nums[right]
			right++
		} else {
			break
		}
	}
	if minLen == math.MaxInt {
		return 0
	}
	return minLen
}

func IntMin1(a, b int) int {
	if a > b {
		return b
	}
	return a
}
